package com.ww.java8.fp.lambda.method.reference;

/**
 * TODO
 *
 * @author wanggw
 * @date 2022-11-15 00:07:22
 */
public class MethodReferences {
	/**
	 * 也符合call()方法的签名
	 * @param name
	 */
    static void hello(String name) {
        System.out.println("Hello, " + name);
    }

    static class Description {
        String about;
        Description(String desc) {
            about = desc;
        }

        /**
         * 符合call()签名，属于静态内部类中的非静态方法
         * @param msg
         */
        void help(String msg) {
            System.out.println(about + " " + msg);
        }
    }

    static class Helper {
    	/**
    	 * 属于静态内部类中的静态方法
    	 * @param msg
    	 */
        static void assist(String msg) {
            System.out.println(msg);
        }
    }

    /**
     * call()
     * Hello, Bob
     * valuable information
     * Help!
     * @param args
     */
    public static void main(String[] args) {
        Describe d = new Describe();
        // show()签名符合Callable的call()签名
        // 将Describe对象的方法引用赋值给Callable，它没有show()方法，而是call()方法，但是Java似乎接受用这个看似奇怪的赋值，因为方法引用
        // 符合Callable的call()方法的签名
        // 可以通过调用call()来调用show()，因为Java将call()映射到show()
        Callable c = d::show;
        c.call("call()");

        /**
         * 这是一个静态方法引用
         */
        c = MethodReferences::hello;
        c.call("Bob");

        // 静态内部类中的非静态方法
        c = new Description("valuable")::help;
        c.call("information");

        // 静态内部类中的静态方法
        c = Helper::assist;
        c.call("Help!");
    }
}

/**
 * 单一方法接口
 */
interface Callable {
    void call(String s);
}

class Describe {
	/**
	 * 参数类型和返回值，符合Callable的call()的签名
	 * @param msg
	 */
    void show(String msg) {
        System.out.println(msg);
    }
}